/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2007，所有权利保留。
 * 
 * 项目名：	rumba
 * 文件名：	BMenuItem.java
 * 模块说明：	
 * 修改历史：
 * Apr 30, 2007 - lxm - 创建。
 */
package com.hd123.rumba.navigation.menu;

import com.hd123.rumba.cartridge.entry.Entry;
import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.gwt.entry.client.menu.CMenu;
import com.hd123.rumba.gwt.entry.client.menu.CMenuItem;
import com.hd123.rumba.runtime.IPersistent;
import com.hd123.rumba.runtime.biz.BPersistent;
import com.hd123.rumba.util.ObjectUtil;

/**
 * 菜单项 | 业务层.维护 | 实体
 * <p>
 * 
 * BK1 = menu + parent + caption<br>
 * BK2 = menu + id
 * 
 * @author lxm
 * 
 */
public class BMenuItem extends BPersistent {

  /** 属性：唯一标识名 */
  private String id;
  /** 属性：所属菜单 */
  private BMenu menu;
  /** 属性：上级菜单项。允许空，表示顶级菜单。 */
  private BMenuItem parentItem;
  /** 属性：模块功能入口 */
  private Entry entry;
  /** 属性：标题 */
  private String caption;
  /** 属性：对齐方式。取值参见常量“VALUE_ALIGN_*”，默认为“VALUE_ALIGN_NORMAL”。 */
  private Integer align = CMenuItem.VALUE_ALIGN_NORMAL;
  /** 属性：提示信息 */
  private String hint;
  /** 属性：图像。 */
  private String image;
  /** 属性：表示热状态的图像。 */
  private String hotImage;

  /**
   * 构造一个菜单项。
   * 
   * @param entry
   *          指定模块功能入口对象。允许传入null。
   * @return 返回创建的菜单项。
   * @throws BusinessException
   */
  public static BMenuItem build(Entry entry) throws BusinessException {
    return build(entry, null, null);
  }

  /**
   * 构造一个菜单项。
   * 
   * @param entry
   *          指定模块功能入口对象。允许传入null。
   * @param caption
   *          指定菜单项的标题。允许传入null，表示创建的菜单项的标题为entry的标题。
   * @param align
   *          指定菜单项的对齐方式。传入null，表示使用默认值。
   * @return 返回创建的菜单项。
   * @throws BusinessException
   */
  public static BMenuItem build(Entry entry, String caption, Integer align)
      throws BusinessException {
    BMenuItem item = new BMenuItem();
    if (entry != null)
      item.setEntry(entry);
    if (caption != null)
      item.setCaption(caption);
    if (align != null)
      item.setAlign(align);
    return item;
  }

  public void readFrom(IPersistent source) throws BusinessException {
    if (true)
      throw BusinessException.neverCallMe();
  }

  /**
   * 取得当前菜单项的级别。
   * 
   * @return 返回级别数，顶级菜单项返回的将是0。
   */
  public int getLevel() {
    if (this.parentItem == null)
      return 0;
    else
      return this.parentItem.getLevel() + 1;
  }

  /**
   * 从指定来源菜单项复制取值。
   * 
   * @param source
   *          指定来源菜单项。
   */
  public void copyValues(BMenuItem source) {
    this.entry = source.entry;
    this.caption = source.caption;
    if (this.menu == null)
      this.align = source.align;
    this.hint = source.hint;
    this.image = source.image;
    this.hotImage = source.hotImage;
  }

  public Integer getAlign() {
    return align;
  }

  public void setAlign(Integer align) throws BusinessException {
    if (!ObjectUtil.equals(this.align, align) && this.menu != null)
      throw new BusinessException(CMenuItem.CAPTION_CLASS + "已被指定所属" + CMenu.CAPTION_CLASS
          + "，禁止修改" + CMenuItem.CAPTION_ALIGN + "。");
    this.align = align;
  }

  public String getCaption() {
    if (caption == null && entry != null)
      return entry.getCaption();
    else
      return caption;
  }

  public void setCaption(String caption) throws BusinessException {
    caption = caption.trim();
    String oldValue = this.caption;
    this.caption = caption;
    if (menu != null)
      try {
        menu.validateItemCaption(this, this.parentItem);
      } catch (BusinessException e) {
        this.caption = oldValue;
        throw e;
      }
  }

  public String getHint() {
    if (hint == null && entry != null)
      return entry.getHint();
    else
      return hint;
  }

  public void setHint(String hint) {
    this.hint = hint;
  }

  public String getHotImage() {
    if (hotImage == null && entry != null)
      return entry.getHotImage();
    else
      return hotImage;
  }

  public void setHotImage(String hotImage) {
    this.hotImage = hotImage;
  }

  public String getImage() {
    if (image == null && entry != null)
      return entry.getImage();
    else
      return image;
  }

  public void setImage(String image) {
    this.image = image;
  }

  public BMenu getMenu() {
    return menu;
  }

  public BMenuItem getParentItem() {
    return parentItem;
  }

  void setMenu(BMenu menu) {
    this.menu = menu;
  }

  void setParentItem(BMenuItem parentItem) {
    this.parentItem = parentItem;
  }

  public Entry getEntry() {
    return entry;
  }

  public void setEntry(Entry entry) throws BusinessException {
    this.entry = entry;
    if (this.menu == null && entry != null)
      this.id = entry.getCfv().getPrefix() + "_" + entry.getId();
    this.caption = null;
    if (this.menu != null)
      this.menu.validateItemCaption(this, this.parentItem);
    this.hint = null;
    this.image = null;
    this.hotImage = null;
  }

  public String getId() {
    return id;
  }

  public void setId(String name) throws BusinessException {
    if (this.menu != null)
      throw new BusinessException("禁止修改" + CMenuItem.CAPTION_CLASS + "的" + CMenuItem.CAPTION_ID
          + "属性。");
    this.id = name;
  }

}
